现代计算机图形学 —— 反走样(Antialiasing)
现代计算机图形学
反走样(Antialiasing)
当我们完成光栅化(Rasterizer)后,我们将会得到一个能在屏幕空间中显示的图案。这个图案的形状类似于三角形,但现在它的三条边都有着很严重的锯齿现象,不符合我们的预期。这就需要使用到我们今天要讲的 反走样(Antialiasing) 技术,也就是俗称的 抗锯齿。
走样原因概述
要将物体显示到屏幕上,就一定需要进行采样(Sampling)。而如果我们的 采样速率 < 信号改变频率,就会出现 走样(Aliasing)。
不同走样形式的产生原因:
- 锯齿(Jaggies)—— sampling in sapce
- 摩尔纹(Moire)—— undersampling images
- 车轮现象(Wagon wheel effect)—— sampling in time
如何做反走样
对原始图像进行 模糊/滤波(Pre-Filtering)
滤波操作概述
通俗的讲,就是在我们在采样之前,先对原始图片进行模糊处理,再进行采样。
使用滤波法(Pre-Filtering)进行反走样
注意反走样(Antialiasing)后,已光栅化三角形的边缘,其中像素的颜色灰度值是中间值。
前后对比
对比下面两张图片,可以明显看出,反走样后的锯齿现象明显的弱了很多。
反走样前 vs 反走样后
将滤波与采样的步骤调换的猜想
那么我们能否在 采样 后再进行 滤波/模糊 处理呢?答案是不行。
先采样再处理的操作有个学名叫做 Blurred Aliasing,这样的操作依然是走样的,只不过走样之后又被模糊了。对比下图可以发现 Blurred Aliasing 所得结果远不如 Antialiasing。
先滤再采和先采再滤的对比
疑问
- 为什么 欠采样(Undersampling)会导致 走样(Aliasing)?
- 为什么在 采样(Sampling) 前 滤波/模糊(Pre-filtering)就可以进行反走样(抗锯齿)?
让我们继续深入挖掘最基础的原因,看看抗锯齿的光栅化要如何进行。
频域(Frequency Domain)
前置知识
- 简单的三角函数
- 频率 与 周期
- 傅里叶级数展开
定义:将函数表示为 sin 和 cos 的加权和。
由此可知,任意一个周期函数都可以由 不同频率 的 sin/cos 周期函数表示
图像的表示
我们都知道,图像是由像素组成。而每一个像素的颜色,可以用红、绿、蓝、透明度四个值表示,大小范围都是0 ~ 255
。如果把每一行所有像素的红、绿、蓝的数值,依次画成三条曲线,就得到下面的图像。
可以看到,每条曲线都在不停的上下波动。有些区域的波动比较小,有些区域突然出现了大幅波动(比如 54 和 324 这两点)。对比一下图像就能发现,曲线波动较大的地方,也是图像出现突变的地方。这说明波动与图像是紧密关联的。图像本质上就是各种色彩波的叠加。
所以,色彩剧烈变化的地方,就是图像的高频区域;色彩稳定平滑的地方,就是低频区域。
傅里叶变换(Fourier Transform)
傅里叶变换做的事情,就是将信号分解为频率。
给定任何一个函数,经过复杂的傅里叶变换,可以得到另一个函数。同样的,得到的函数经过逆傅里叶变换,可以得到原函数。
傅里叶变换 与 逆傅里叶变换
走样原因深度分析
根据上面的知识点,我们就可以分析出 走样(Aliasing) 的原因。
首先,图像在计算机中是以波的形式进行记录,而根据傅里叶级数,一个波可以由任意个 不同频率 的 sin/cos函数 组成。此时,我们对这些分解而成的波进行采样,高频率的波就会出现非常明显的走样现象。
因此在采样后,重新组合而成的波形会因为高频率波的走样现象,而发生严重的走样。
高频率的波走样严重
由此可知,我们可以通过剔除高频率的波,也就是俗称的 低通滤波(low-pass filtering),以达到 反走样(Antialiasing) 的效果。且因为图像中高频段的波是在表示图像的轮廓,因此所得的图象是一个模糊的样子,所以 滤波处理 又被俗称为 模糊处理。
低通(low-pass)滤波后图像变得模糊
分析完原因后,就可以大致回答我们之前的疑问:
为什么 欠采样(Undersampling)会导致 走样(Aliasing)?
- 因为 欠采样 会导致高频段的波走样严重,从而导致整体走样。
为什么在 采样(Sampling) 前 滤波/模糊(Pre-filtering)就可以进行反走样(抗锯齿)?
- 低通滤波可以剔除高频段的波,也就是剔除了部分走样严重的波,可以一定程度上实现反走样;而先采样后滤波,通俗理解就是对 边界已经产生走样的图片 进行 模糊边界 的处理,其结果依旧是已经走样的图片。
反走样方法详细介绍
在游戏中,成熟的反走样方法有很多,例如:MSAA/TAA 等。本文着重学习反走样的方法,因此重点介绍 Pre-Filtering 和MSAA两种常见的反走样方法。
Pre-Filtering
一个像素中可能会被界限分明的划分为两个区域,如果此时中心点取到其中一种颜色上,那么另一种颜色就有可能丢失,从而导致走样。
既然如此,我们只需要将这个像素中的颜色混合均匀,再选择像素的中心点进行采样就好了。
具体操作
- 卷积(Convolve):使用 低通滤波器(low-pass Filter) 对每一个像素进行 卷积(Convolve) ,通俗的讲就是对一个像素内部进行平均,使得图像达到模糊的效果。
对一个像素进行 卷积/平均
- 采样(Sample):对像素的中心点进行采样。
优缺点
- 优点
能够准确地近似表示一个像素的应该呈现的颜色,拥有较好的反走样效果。
- 缺点
计算一个像素内的色彩比例时较为麻烦。
Antialiasing By Supersampling(MSAA)
我们已经知道,Pre-Filtering 反走样方法在计算一个像素内的色彩比例时,需要比较复杂的计算。如果屏幕像素增多、或是图像变得复杂,则很可能会导致渲染较为缓慢。
为了解决这一问题,前人想出了一个近似方案,就是在一个像素内设置四个采样点,再平均这四个采样点获得的数据,决定最后该像素显示的颜色。人们根据这一方法的采样方式,给其起名为 超采样反走样法(Multisample Antialiasing),简称 MSAA .
具体操作
优缺点
- 优点
有较好的反走样效果,但因为是 Pre-Filtering 的近似,效果肯定不如真正的 Pre-Filtering 方法。
- 缺点
相比于单采样,采样的数据量大大增加。
其他反走样方法
现代计算机图形学还常使用以下反走样方法:
- FXAA(Fast Approximate AA)
- TAA(Temporal AA)
这些方法都得到工业界的广泛使用。